// https://www.lintcode.com/problem/segment-tree-query/description
// 202. 线段树的查询
// 对于一个有n个数的整数数组，在对应的线段树中, 根节点所代表的区间为0-n-1, 每个节点有一个额外的属性max，值为该节点所代表的数组区间start到end内的最大值。

// 为SegmentTree设计一个 query 的方法，接受3个参数root, start和end，线段树root所代表的数组中子区间[start, end]内的最大值。

// 样例
// 对于数组 [1, 4, 2, 3], 对应的线段树为：

//                   [0, 3, max=4]
//                  /             \
//           [0,1,max=4]        [2,3,max=3]
//           /         \        /         \
//    [0,0,max=1] [1,1,max=4] [2,2,max=2], [3,3,max=3]
// query(root, 1, 1), return 4

// query(root, 1, 2), return 4

// query(root, 2, 3), return 3

// query(root, 0, 2), return 4

// 注意事项
// 在做此题之前，请先完成 线段树构造 这道题目。



/**
 * Definition of SegmentTreeNode:
 * class SegmentTreeNode {
 * public:
 *     int start, end, max;
 *     SegmentTreeNode *left, *right;
 *     SegmentTreeNode(int start, int end, int max) {
 *         this->start = start;
 *         this->end = end;
 *         this->max = max;
 *         this->left = this->right = NULL;
 *     }
 * }
 */

class Solution {
public:
    /**
     * @param root: The root of segment tree.
     * @param start: start value.
     * @param end: end value.
     * @return: The maximum number in the interval [start, end]
     */
    int query(SegmentTreeNode * root, int start, int end) {
        if (root->end < start || root->start > end)
        {
            return INT_MIN;
        }
        else if (root->start >= start && root->end <= end)
        {
            return root->max;
        }
        else
        {
            return max(query(root->left, start, end), query(root->right, start, end));
        }
        // 不需要二分法，每一区间的最大值都包含了子区间的最大值，直接比较区间包含关系就行
    }
};